﻿using System.Web.Mvc;
using System;
using System.Collections.Generic;
using System.IO;
using System.Drawing;
using Dosimetria.Models.DataAnnotations_Classes;
using Dosimetria.Shared;
using Dosimetria.DAL;
using System.Data;
using Dosimetria.Models;
using System.Text;


namespace Dosimetria.Controllers
{
    
    public class DosimetroController : Controller
    {
        private static Querys db = new Querys();
        //
        // GET: /Dosimetria/

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Reasignacion()
        {
            return View();
        }

        public ActionResult Create()
        {
            ViewBag.TiposDosimetros = new SelectList(db.getAllTiposDosimetros(), "id", "tipo");
            return View();
        }

        public ActionResult CreateCodigoBarras()
        {
            return View();
        }

        public ActionResult MantenedorHCDDosimetro()
        {
            return View();
        }

        public ActionResult EnvioCorreoUsuarioDosimetros()
        {
            return View();
        }

        [HttpPost]
        public int getCantDosimetroMostrar(string tipoDosimetro)
        {
            int res = 0;
            switch (tipoDosimetro)
            {
                case "PD3":
                    res = db.getCantidadD3DosimetroRecibidosByTipoCristal("100");
                    break;
                case "PD3(6/7)":
                    res = db.getCantidadD3DosimetroRecibidosByTipoCristal("600");
                    break;
                case "PD5":
                    res = db.getCantPD5Recibidos();
                    break;
                case "A":
                    res = db.getCantDosimetroMostrar(tipoDosimetro);
                    break;
                case "333":
                    res = db.getCantDosimetrosRecibidosStartBy333();
                    break;
                //No se verifica ya que el pd5-film se pasan al txt todos los recibidos
                case "PD5-FILM":
                    res = 0;
                    break;
            }
            return res;
        }

        private List<Dosimetro> getDosimetrosRecibidosByTipoDosimetro(string tipo)
        {
            return db.getDOsimetrosRecibidosByTipoDosimetro(tipo);
        }

        public List<Dosimetro> getPD5FilmRecibidos()
        {
            return db.getPD5FilmRecibidos();
        }

        private List<Dosimetro> getPD3DosimetroRecibidosByTipoCristal(string tipoCristal)
        {
            return db.getPD3DosimetroRecibidosByTipoCristal(tipoCristal);
        }

        private List<Dosimetro> getPD5Recibidos()
        {
            return db.getPD5Recibidos();
        }

        private List<Dosimetro> getDosimetrosRecibidosStartBy333()
        {
            return db.getDosimetrosRecibidosStartBy333();
        }

        public FileStreamResult GetTXT(string tipoDosimetro)
        {
            var string_with_your_data = "";
            var nombreArchivo = "";
            List<Dosimetro> lDosimetro;
            switch (tipoDosimetro){
                case "PD3":
                    string_with_your_data = TXT.formatoTXT(getSubListaDosimetro(getPD3DosimetroRecibidosByTipoCristal("100")), tipoDosimetro);
                    nombreArchivo = "PD3.set";
                    break;
                case "PD3(6/7)":
                    string_with_your_data = TXT.formatoTXT(getSubListaDosimetro(getPD3DosimetroRecibidosByTipoCristal("600")), tipoDosimetro);
                    nombreArchivo = "PD3(6/7).set";
                    break;
                case "PD5":
                    lDosimetro = getPD5Recibidos();
                    string_with_your_data = TXT.formatoTXT(getSubListaDosimetro(lDosimetro), tipoDosimetro);
                    nombreArchivo = "PD5.set";
                    break;

                case "A":
                    string_with_your_data = TXT.formatoTXT(getSubListaDosimetro(getDosimetrosRecibidosByTipoDosimetro(tipoDosimetro)), tipoDosimetro);
                    nombreArchivo = "Anillo.set";
                    break;
                case "333":
                    string_with_your_data = TXT.formatoTXT(getSubListaDosimetro(getDosimetrosRecibidosStartBy333()), tipoDosimetro);
                    nombreArchivo = "333.set";
                    break;
                    //Lista completa de dosimetros con archivo .pel
                case "PD5-FILM":
                    lDosimetro = getPD5FilmRecibidos();
                    setTrueGeneradorTXT(lDosimetro);
                    string_with_your_data = TXT.formatoTXT(lDosimetro, tipoDosimetro);
                    nombreArchivo = "PD5-FILM.pel";
                    break;
            }
            var byteArray = Encoding.ASCII.GetBytes(string_with_your_data);
            var stream = new MemoryStream(byteArray);
            return File(stream, "text/plain", nombreArchivo);   
        }

        public void setTrueGeneradorTXT(List <Dosimetro> lDosimetro)
        {
            foreach(Dosimetro d in lDosimetro)
            {
                db.updateGeneracionTXTHCDDosim(d.codigoDosimetro);  
            }
        }

        /// <summary>
        /// Se realiza una sublista de dosimetros y se realiza el update 
        /// </summary>
        /// <param name="lDosimetro"></param>
        /// <returns></returns>
        private List<Dosimetro> getSubListaDosimetro(List<Dosimetro> lDosimetro)
        {
            int num = 1;
            List<Dosimetro> lDosim = new List<Dosimetro>();
            foreach(Dosimetro d in lDosimetro)
            {
                if (num < 26)
                {
                    lDosim.Add(d);
                    db.updateGeneracionTXTHCDDosim(d.codigoDosimetro);
                    num++;
                }
            }
            return lDosim;
        }

        [HttpPost]
        public void sendEmails(HCDDosimetro[] data)
        {
            try
            {
                foreach (HCDDosimetro _hcdDosim in data)
                {
                    if (_hcdDosim.enviarCorreo)
                    {     
                        string file = Server.MapPath("../ArchivosEnvio/FormDatosReasignacion.doc");
                       
                        string cuerpo = "Recientemente Ud. informo que el dosímetro N° " +  _hcdDosim.NDosimetro + ", originalmente enviado a " + 
                                        _hcdDosim.nombreFuncionario + " fue reasignado. Le ruego que en el formulario adjunto nos envíe los antecedentes de la persona que efectivamente uso el dosímetro";
                        //string cuerp1o = "Estimados Sres.: <br /> <br /> " +
                        //                "Se solicita favor enviar el formulario adjunto con los datos solicitados ya que se ha informado que el dosimetro Cod " + _hcdDosim.NDosimetro + " se encuentra reasignado a otro trabajador. <br /> <br /> " +
                        //                 "De ante mano gracias <br />"; 
                        Mail.Send("dosim@dosim.cl", _hcdDosim.correoEncargadoEmpresa, "Formulario Reasignación", cuerpo, true, file);
                    }
                } 
            }
            catch(Exception e)
            {
                
            }
           
        }

       

        [HttpPost]
        public void updateHCDMantenimiento(HCDDosimetro[] hcdData)
        {
            try
            {
                foreach (HCDDosimetro _hcdDosim in hcdData)
                {
                    if (!_hcdDosim.Devuelto)
                    {
                        _hcdDosim.fechaRecepcion = " ";
                        db.updateHCDDosimetro(_hcdDosim);
                    }
                    else
                    {
                        //No se realiza update a la fecha de recepcion del dosimetro
                        db.updateHCDDosimetroSinFechaRecepcion(_hcdDosim);
                    }
                    
                }
            }
            catch (Exception e)
            {
                
            }
        }

        [HttpPost]
        public void saveHCD(HCDDosimetro[] hcdData)
        {
            try
            {
                /*
                 * Verifico existencia de una hcd 
                 * En caso de exisitir codigo hcd solamente se actualizaran los registros
                 * En caso contrario se creara una nueva hcd y hcdDosimetros asociados
                 * 
                 * **/
                if (hcdData[0].HCDID != 0)
                {
                    foreach (HCDDosimetro _hcdDosim in hcdData)
                    {
                        if (_hcdDosim.Observacion == null)
                        {
                            _hcdDosim.Observacion = " ";
                        }
                        if (_hcdDosim.fechaRecepcion == null)
                        {
                            _hcdDosim.fechaRecepcion = "";
                        }
                        if (_hcdDosim.Devuelto || _hcdDosim.Extraviado)
                        {
                            db.updateHCDDosimetro(_hcdDosim);
                        }
                        if (_hcdDosim.FinControl)
                        {
                            //Se realiza fin de control en caso de reasignacion y fin de control
                            db.updateFechaTerminoAndVigencia(_hcdDosim.func_cod, _hcdDosim.codContrato);                           
                        }
                    }
                }
                else
                {
                    int codigoHCD = db.createHCD(hcdData[0].comentarioHCD);
                    foreach (HCDDosimetro _hcdDosim in hcdData)
                    {
                        _hcdDosim.HCDID = codigoHCD;
                        if (_hcdDosim.Observacion == null)
                        {
                            _hcdDosim.Observacion = " ";
                        }
                        if (_hcdDosim.fechaRecepcion == null)
                        {
                            _hcdDosim.fechaRecepcion = "";
                        }
                        db.createDosimetroHCD(_hcdDosim);
                        //Realizo el fin de control en caso de marcar fin de control
                        if (_hcdDosim.FinControl)
                        {
                            db.updateFechaTerminoAndVigencia(_hcdDosim.func_cod, _hcdDosim.codContrato);  
                        }
                    }
                }
            }
            catch (Exception e)
            {

            }
        }

        /// <summary>
        /// Metodo que retorna un JSON con los dosimetros reasignados en funcion del codigo de contrato y la fecha de envio
        /// </summary>
        /// <param name="fechaEnvio"></param>
        /// <param name="codigoContrato"></param>
        /// <returns></returns>
        [HttpPost]
        public JsonResult getDataHCDDosimReasignadosByFechaEnvioAndCodContrato(int codContrato, string fechaEnvio)
        {
            List<HCDDosimetro> _lHCDDosim = null;

            try
            {
                _lHCDDosim = db.getDataHCDDosimReasignadosByFechaEnvioAndCodContrato(codContrato, fechaEnvio);
            }
            catch(Exception e)
            {
                
            }
            return Json(new { Result = _lHCDDosim });
        }

        /// <summary>
        /// Metodo que retorna un JSON con los dosimetros reasignados en funcion del codigo de dosimetro
        /// </summary>
        /// <param name="fechaEnvio"></param>
        /// <param name="codigoContrato"></param>
        /// <returns></returns>
        [HttpPost]
        public JsonResult getDataHCDDosimReasignadoByCodDosim(int codDosimetro)
        {
            List<HCDDosimetro> _lHCDDosim = null;

            try
            {
                _lHCDDosim = db.getDataHCDDosimReasignadoByCodDosim(codDosimetro);
            }
            catch (Exception e)
            {

            }
            return Json(new { Result = _lHCDDosim });
        }

        public JsonResult getAllDataHCDDosimetroHCD(int codigoContrato, string fechaEnvio)
        {
            List<HCDDosimetro> lHCDDosim = null;
            try
            {
                lHCDDosim = db.getAllDataHCDDosimByCodigoContratoAndFechaEnvio(codigoContrato, fechaEnvio);
            }
            catch (Exception e)
            {

            }
            return Json(new { Result = lHCDDosim });
        }

        [HttpPost]
        public int checkExistenciaInHCDDosimetroByCodContratoAndFechaEnvio(string codigoContrato, string fechaEnvio)
        {
            return db.checkExistenciaInHCDDosimetroByCodContratoAndFechaEnvio(codigoContrato, fechaEnvio);
        }

        /// <summary>
        /// Metodo que retorna la informacion de los dosimetros registrados en HCD_dosimetros funcion de codigo de contrato y fecha de envio 
        /// NOTA: Puede variar si esta devuelto 1 o no devuelto 0
        /// </summary>
        /// <param name="codigoContrato"></param>
        /// <param name="fechaEnvio"></param>
        /// <returns></returns>
        [HttpPost]
        public JsonResult getDataHCDDosimetroHCD(int codigoContrato, string fechaEnvio, string devuelto = "0")
        {
            List<HCDDosimetro> lHCDDosim = null;
            try
            {
              lHCDDosim  = db.getDataHCDDosimByCodigoContratoAndFechaEnvio(codigoContrato, fechaEnvio, devuelto);
            }
            catch(Exception e)
            {
                
            }
            return Json(new { Result = lHCDDosim });
        }

        [HttpPost]
        public JsonResult getDosimetrosRelacionadosByCodigoContratoAndFechaEnvioDosim(int codigoContrato, string fechaEnvio)
        {
            List<Dosimetro> lDosimetros = new List<Dosimetro>();
            List<HCDDosimetro> lDataGrilla = new List<HCDDosimetro>();
            try
            {
                lDosimetros = db.getDosimetrosRelacionadosByCodigoContratoAndFechaEnvioDosim(codigoContrato, fechaEnvio);



                foreach(Dosimetro d in lDosimetros)
                {
                    HCDDosimetro dg = new HCDDosimetro();
                    dg.NDosimetro = d.codigoLogicoDosimetro;
                    dg.TipoDosimetro = d.tipoDosimetro;
                    dg.codigoUnicoDosim = d.id;
                    dg.fechaEnvioDosimetro = fechaEnvio;
                    dg.codContrato = codigoContrato;
                    dg.func_cod = d.Funcionario.id;
                    dg.nombreFuncionario = db.getFuncionarioByCodFuncionario(dg.func_cod).nombre.Trim();
                    //dg.nombreFuncionario = d.Funcionario.nombre.Trim();
                    lDataGrilla.Add(dg);
                }
            }
            catch (Exception e)
            {
                
            }
            return Json(new {Result = lDataGrilla});
        }

        [HttpPost]
        public JsonResult getContratoAndDataDosimetroByIdDosimetro(int idDosimetro)
        {
            Dosimetro dosim = null;
            try
            {
               // dosim = db.getFechaEnvioAndTipoDosimetroByIDDosimetro(idDosimetro);
                dosim = db.getFechaEnvioTipoDosimetroAndContratoByCodigoLogicoDosimetro(idDosimetro);

                //List<Dosimetro> lDosim = new List<Dosimetro>();
                //lDosim.Add(dosim);

                //c = db.getIdContratoByIDDosimetro(idDosimetro);
                //c.lDosimetros = lDosim;
                

            }
            catch(Exception e)
            {
               
            }
          
            return Json( new { Result = dosim} );
        }

        public ActionResult GetCodeBar( string code, int width, int height, int size)
        {
            return File(CodeBarService.GenerarCodigo(code, width, height, size), "image/jpg");
        }

        public ActionResult GetCode(string code)
        {
            return File(CodeBarService.GenerarCodigoEAN13(code), "image/bmp");
        }


        [HttpPost]
        public JsonResult getDataDosimetroAndDataContrato(int idDosimetro)
        {
            Contrato c = db.getDataDosimetroAndDataContratoByIdDosimetro(idDosimetro);
            return Json(new { Result = c });
        }

        [HttpPost]
        public void reasignacionFuncionario(string codigoContrato, string fechaEnvio, string codFuncionario, string codigoUnicoDosimetro)
        {
            /*
             * Para realizar la reasignacion se siguen los siguientes pasos
             * 1. Se cambia en forma directa la relacion del funcionario en la tabla dosim_fun
             * 2. Se cambia la asociacion en hcd_dosimetro y quito valor de reasignado (solo queda como devuelto para que no se muestre en la HCD)
             * 3. Se da de baja el usuario en CONT_FUN
             * */
             
            //Paso 1
            //Obtengo el id del funcionario antiguo
            int codigoFuncionarioAntiguo = db.getCodeFunctionaryOLD(codigoUnicoDosimetro, fechaEnvio, codigoContrato).id;

            //Obtengo datos del funcionario nuevo
            Funcionario f = db.getDataFuncionariobyCodFuncionario(codFuncionario);

            //Realizo la reasingacion en la tabla dosim_fun
            db.reasingacionDosimetro(codFuncionario, codigoContrato, codigoUnicoDosimetro, codigoFuncionarioAntiguo.ToString(), f.rut, f.dv);
          
            //Paso 2
            db.updateHCDDOsimetro(codigoUnicoDosimetro, codigoContrato, fechaEnvio, codFuncionario);

            ////Paso 3
            db.updateFechaTerminoAndVigencia(Convert.ToInt32(codigoFuncionarioAntiguo), Convert.ToInt32(codigoContrato));

        }

        [HttpGet]
        public ActionResult Reasignacion(int codigoContrato, string fechaEnvio)
        {
            List<HCDDosimetro> _hcdDosim = null;
            try
            {
                _hcdDosim = db.getDataHCDDosimReasignadosByFechaEnvioAndCodContrato(codigoContrato, fechaEnvio);
                ViewBag.CodContrato = _hcdDosim[0].codContrato;
                ViewBag.FechaEnvio = _hcdDosim[0].fechaEnvioDosimetro;
            }
            catch (Exception e) { }
            
            return View(_hcdDosim);
        }

        /// <summary>
        /// Verifica si existe algun dosimetro cargado para cierto funcionario en cierto contrato
        /// </summary>
        /// <param name="codigoContrato"></param>
        /// <param name="codFuncionario"></param>
        /// <returns></returns>
        //public bool verificacionExistenciaDosimetroAsociado(string codigoContrato, string codFuncionario)
        //{
            
        //}

        public JsonResult getFuncionarioByContratoAndName(string codigoContrato, string patron)
        {
            List<Funcionario> _lFuncionario = db.getFuncionarioByContratoAndName(codigoContrato, patron);
            return Json(new{Result = _lFuncionario});
        }

        public JsonResult getFuncionarioByContratoAndRut(string codigoContrato, string patron)
        {
            List<Funcionario> _lFuncionario = db.getFuncionarioByContratoAndRut(codigoContrato, patron);
            return Json(new { Result = _lFuncionario });
        }

        public JsonResult getFuncionarioByIdContrato(int codigoContrato)
        {
            List<Funcionario> _lFuncionario = db.getFuncionarioByIdContrato(codigoContrato);
            return Json(new { Result = _lFuncionario });
        }

        public ActionResult GenerarTXT()
        {
            return View();
        }
     
        
    }
}
